BatchNorm ================= 对输入数组按通道执行批归一化(Batch Normalization)计算。 该算子使用给定的均值与方差对输入进行标准化,并通过 epsilon 保证数值稳定性。 .. math:: dst_{i,j} = \frac{src_{i,j} - mean_j}{\sqrt{variance_j + \epsilon}} 其中: - :math:`i` 表示第 ``unit`` 个样本 - :math:`j` 表示通道索引 - :math:`mean_j`、:math:`variance_j` 为第 :math:`j` 个通道的统计量 对于 ``int8`` 类型输入,内部以浮点方式计算,最终结果按实现规则取整并输出为 ``int8``。 输入: - **input** - 输入数据地址,形状为 ``[unit, channel]``。 - **mean** - 均值数组地址,长度为 ``channel``。 - **variance** - 方差数组地址,长度为 ``channel``。 - **unit** - 样本数(或展开后的空间维度)。 - **channel** - 通道数。 - **epsilon** - 数值稳定因子。 - **core_mask** - 核掩码(仅适用于共享存储版本)。 输出: - **output** - 批归一化后的输出数据地址。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持 ``int8``、``fp32`` 类型 - MT7004 支持 ``fp16``、``fp32`` 类型 - 当前实现不包含 scale 与 bias,仅执行标准化操作 **共享存储版本:** .. c:function:: void i8_batchnorm_s(int8_t* input, int8_t* output, float* mean, float* variance, int unit, int channel, float epsilon, int core_mask) .. c:function:: void fp_batchnorm_s(float* input, float* output, float* mean, float* variance, int unit, int channel, float epsilon, int core_mask) .. c:function:: void hp_batchnorm_s(half* input, half* output, float* mean, float* variance, int unit, int channel, float epsilon, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 15 // FT78NE 示例 #include #include int main(int argc, char* argv[]) { int8_t *input = (int8_t *)0xA0000000; // input 在 DDR 空间 int8_t *output = (int8_t *)0xC0000000; float *mean = (float *)0xA1000000; float *var = (float *)0xA2000000; int unit = 128; int channel = 64; float epsilon = 1e-5f; int core_mask = 0xff; i8_batchnorm_s(input, output, mean, var, unit, channel, epsilon, core_mask); return 0; } **私有存储版本:** .. c:function:: void i8_batchnorm_p(int8_t* input, int8_t* output, float* mean, float* variance, int unit, int channel, float epsilon) .. c:function:: void fp_batchnorm_p(float* input, float* output, float* mean, float* variance, int unit, int channel, float epsilon) .. c:function:: void hp_batchnorm_p(half* input, half* output, float* mean, float* variance, int unit, int channel, float epsilon) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 14 // FT78NE 示例 #include #include int main(int argc, char* argv[]) { int8_t *input = (int8_t *)0x10810000; // input 在 L2 空间 int8_t *output = (int8_t *)0x10820000; float *mean = (float *)0x10830000; float *var = (float *)0x10840000; int unit = 128; int channel = 64; float epsilon = 1e-5f; i8_batchnorm_p(input, output, mean, var, unit, channel, epsilon); return 0; }